home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Lib / table / tb_getlocal.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  6.9 KB  |  320 lines

  1. /* tb_getlocal.c: convert address to user reference */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/table/RCS/tb_getlocal.c,v 6.0 1991/12/18 20:24:28 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/table/RCS/tb_getlocal.c,v 6.0 1991/12/18 20:24:28 jpo Rel $
  9.  *
  10.  * $Log: tb_getlocal.c,v $
  11.  * Revision 6.0  1991/12/18  20:24:28  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include        "util.h"
  19. #include        "chan.h"
  20. #include     "loc_user.h"
  21. #include     <ctype.h>
  22. #include    <pwd.h>
  23. #include <isode/cmd_srch.h>
  24.  
  25. #define         MAX_USER_ARGS           50
  26. extern char *mboxname, *mailfilter, *sysmailfilter;
  27. extern CMD_TABLE tbl_bool[];
  28.  
  29. static CMD_TABLE key_tbl[] = {
  30. #define T_UID        1
  31.     "uid",        T_UID,
  32. #define T_GID        2
  33.     "gid",        T_GID,
  34. #define T_USERNAME    3
  35. #define T_START        T_USERNAME     /* start backwards compat  */
  36.     "username",    T_USERNAME,
  37. #define T_DIRECTORY    4
  38.     "directory",    T_DIRECTORY,
  39. #define T_MAILBOX    5
  40. #define T_FINISH    T_MAILBOX     /* end backwards compat */
  41.     "mailbox",    T_MAILBOX,
  42. #define T_SHELL        6
  43.     "shell",    T_SHELL,
  44. #define T_HOME        7
  45.     "home",        T_HOME,
  46. #define T_MAILFORMAT    8
  47.     "mailformat",    T_MAILFORMAT,
  48. #define T_RESTRICTED    9
  49.     "restricted",    T_RESTRICTED,
  50. #define T_MAILFILTER    10
  51.     "mailfilter",    T_MAILFILTER,
  52.     "usermailfilter",T_MAILFILTER,
  53. #define T_SYSMAILFILTER    11
  54.     "sysmailfilter",T_SYSMAILFILTER,
  55. #define T_SEARCHPATH    12
  56.     "searchpath",    T_SEARCHPATH,
  57.     "PATH",        T_SEARCHPATH,
  58. #define T_OPTS        13
  59.     "opts",        T_OPTS,
  60.     0, -1
  61.     };
  62.  
  63. static CMD_TABLE mf_tbl[] = {
  64.     "pp",    MF_PP,
  65.     "mmdf",    MF_PP,
  66.     "sendmail", MF_UNIX,
  67.     "unix",    MF_UNIX,
  68.     "auto",    MF_AUTO,
  69.     0,    -1
  70. };
  71.  
  72.  
  73. static char def[] = "default";
  74. static char none[] = "none";
  75. static int parse_entry ();
  76.  
  77. extern void getfpath ();
  78. /* ---------------------  Begin  Routines  -------------------------------- */
  79.  
  80. LocUser    *tb_getlocal (key, channel)
  81. char            *key;
  82. CHAN        *channel;
  83. {
  84.     LocUser    *loc;
  85.     char    buf [BUFSIZ];
  86.  
  87.  
  88.     PP_DBG (("Lib/tb_getlocal (%s, %s)", key, channel -> ch_name));
  89.  
  90.     if (channel -> ch_table == NULL) {
  91.         PP_LOG (LLOG_EXCEPTIONS,
  92.              ("Channel %s (%s) doesn't have a table",
  93.             channel -> ch_name, channel -> ch_show));
  94.         return NULL;
  95.     }
  96.  
  97.     loc = (LocUser *) smalloc (sizeof *loc);
  98.     bzero ((char *)loc, sizeof *loc);
  99.     loc -> restricted = FALSE;
  100.     loc -> mailformat = MF_PP;
  101.  
  102.     if (tb_k2val (channel -> ch_table, def, buf, TRUE) == OK)
  103.         if (parse_entry (loc, buf, def) == NOTOK) {
  104.             free_loc_user (loc);
  105.             return NULL;
  106.         }
  107.             
  108.  
  109.     if (lexequ (def, key) == 0)
  110.         return loc;
  111.  
  112.     if (tb_k2val (channel -> ch_table, key, buf, TRUE) == NOTOK) {
  113.         free_loc_user (loc);
  114.         return NULL;
  115.     }
  116.  
  117.     if (parse_entry (loc, buf, key) == NOTOK) {
  118.         free_loc_user (loc);
  119.         return NULL;
  120.     }
  121.  
  122.     /* see if the result is valid */
  123.     if (loc -> directory == NULLCP) {
  124.         if (loc -> home)
  125.             loc -> directory = strdup(loc->home);
  126.         else {
  127.             PP_LOG (LLOG_EXCEPTIONS,
  128.                 ("No directory or home specified for %s", key));
  129.             free_loc_user (loc);
  130.             return NULL;
  131.         }
  132.     }
  133.     if (loc -> home == NULLCP)
  134.         loc -> home = strdup(loc->directory);
  135.  
  136.     if (loc->mailfilter == NULLCP)
  137.         loc -> mailfilter = strdup (mailfilter);
  138.     if (lexequ(loc -> mailfilter, none) == 0) {
  139.         free (loc -> mailfilter);
  140.         loc -> mailfilter = NULLCP;
  141.     }
  142.     else if (strcmp (loc->directory, loc -> home) != 0) {
  143.         getfpath (loc -> home, loc -> mailfilter, buf);
  144.         free (loc -> mailfilter);
  145.         loc -> mailfilter = strdup(buf);
  146.     }
  147.     if (loc -> sysmailfilter == NULLCP)
  148.         loc -> sysmailfilter = strdup (sysmailfilter);
  149.     if (lexequ(loc -> sysmailfilter, none) == 0) {
  150.         free (loc -> sysmailfilter);
  151.         loc -> sysmailfilter = NULLCP;
  152.     }
  153.  
  154.     return loc;
  155. }
  156.  
  157. void    free_loc_user (loc)
  158. LocUser    *loc;
  159. {
  160.     if (loc -> username)
  161.         free (loc->username);
  162.     if (loc -> directory)
  163.         free (loc -> directory);
  164.     if (loc -> mailbox)
  165.         free (loc -> mailbox);
  166.     if (loc -> shell)
  167.         free (loc -> shell);
  168.     if (loc -> home)
  169.         free (loc -> home);
  170.     if (loc -> mailfilter)
  171.         free (loc -> mailfilter);
  172.     if (loc -> sysmailfilter)
  173.         free (loc -> sysmailfilter);
  174.     if (loc -> searchpath)
  175.         free (loc -> searchpath);
  176.     if (loc -> opts)
  177.         free (loc -> opts);
  178.     free ((char *) loc);
  179. }
  180.  
  181. static int parse_entry (loc, buf, key)
  182. LocUser *loc;
  183. char    *buf;
  184. char    *key;
  185. {
  186.     int count = T_START - 1;
  187.     int    state;
  188.     int    argc;
  189.     int    val;
  190.     char *argvl[MAX_USER_ARGS], **argv;
  191.     int    seenuid = 0, seengid = 0;
  192.     char    *p;
  193.  
  194.     if ((argc = sstr2arg (buf, MAX_USER_ARGS, argvl, " \t,")) == NOTOK)
  195.         return (NOTOK);
  196.     
  197.     for(argv = argvl; argc > 0; argc--, argv++) {
  198.         char ** resp = NULLVP;
  199.         
  200.         if (!isstr(*argv))
  201.             continue;
  202.  
  203.         if ((p = index (*argv, '=')) == NULL) {
  204.             if (++count > T_FINISH) {
  205.                 PP_LOG (LLOG_EXCEPTIONS,
  206.                     ("Info string `%s' for %s not in key=val format",
  207.                      *argv, key));
  208.                 return NOTOK;
  209.             }
  210.             state = count;
  211.             p = *argv;
  212.         }
  213.         else {
  214.             *p++ = '\0';
  215.             state = cmd_srch (*argv, key_tbl);
  216.         }
  217.             
  218.         switch (state) {
  219.             case T_UID:
  220.             loc -> uid = atoi(p);
  221.             seenuid = 1;
  222.             continue;
  223.             case T_GID:
  224.             loc -> gid = atoi(p);
  225.             seengid = 1;
  226.             continue;
  227.             case T_USERNAME:
  228.             resp = &(loc -> username);
  229.             break;
  230.             case T_DIRECTORY:
  231.             resp = &(loc -> directory);
  232.             break;
  233.             case T_MAILBOX:
  234.             resp = &(loc -> mailbox);
  235.             break;
  236.             case T_SHELL:
  237.             resp = &(loc -> shell);
  238.             break;
  239.             case T_HOME:
  240.             resp = &(loc -> home);
  241.             break;
  242.             case T_MAILFORMAT:
  243.             if ((val = cmd_srch (p, mf_tbl)) != NOTOK)
  244.                 loc -> mailformat = val;
  245.             else
  246.                 PP_LOG (LLOG_EXCEPTIONS,
  247.                     ("Bad value for mailformat %s in %s",
  248.                      p, key));
  249.             continue;
  250.             case T_RESTRICTED:
  251.             if ((val = cmd_srch (p, tbl_bool)) != NOTOK)
  252.                 loc -> restricted = val;
  253.             else
  254.                 PP_LOG (LLOG_EXCEPTIONS,
  255.                     ("Bad value for restricted %s in %s",
  256.                      p, key));
  257.             continue;
  258.             case T_MAILFILTER:
  259.             resp = &(loc -> mailfilter);
  260.             break;
  261.             case T_SYSMAILFILTER:
  262.             resp = &(loc -> sysmailfilter);
  263.             break;
  264.             case T_SEARCHPATH:
  265.             resp = &(loc -> searchpath);
  266.             break;
  267.             case T_OPTS:
  268.             resp = &(loc -> opts);
  269.             break;
  270.             default:
  271.             PP_LOG (LLOG_EXCEPTIONS,
  272.                 ("Unknown key in user info for %s '%s' (%s)",
  273.                  key, *argv, p));
  274.             continue;
  275.         }
  276.         if (resp)
  277.         {
  278.             if (*resp)
  279.                 free (*resp);
  280.             *resp = strdup(p);
  281.         }
  282.     }
  283.     /* start fixing up special cases */
  284.     if (loc -> mailbox == NULLCP)
  285.         loc -> mailbox = strdup (mboxname);
  286.  
  287.  
  288.     if (loc -> username) {
  289.         if (isdigit (*loc -> username) &&
  290.             (p = index (loc -> username, '/'))) {
  291.             *p ++ = NULL;
  292.             loc -> uid = atoi (loc -> username);
  293.             loc -> gid = atoi (p);
  294.             free (loc -> username);
  295.             loc -> username = NULLCP;
  296.         }
  297.         else {
  298.             struct passwd *pwd;
  299.  
  300.             if ((pwd = getpwnam (loc -> username)) == NULL) {
  301.                 PP_LOG (LLOG_EXCEPTIONS, 
  302.                     ("No such local user %s", loc -> username));
  303.                 return NOTOK;
  304.             }
  305.  
  306.             if (seenuid == 0)
  307.                 loc -> uid = pwd -> pw_uid;
  308.             if (seengid == 0)
  309.                 loc -> gid = pwd -> pw_gid;
  310.             if (loc -> home == NULLCP)
  311.                 loc -> home = strdup (pwd -> pw_dir);
  312.             if (loc -> shell == NULLCP)
  313.                 loc -> shell = strdup (pwd -> pw_shell);
  314.             if (loc -> directory == NULLCP)
  315.                 loc -> directory = strdup (pwd -> pw_dir);
  316.         }
  317.     }
  318.     return OK;
  319. }
  320.